(DFS)地图 题解

您所在的位置:网站首页 y pp的朋友 (DFS)地图 题解

(DFS)地图 题解

2023-08-23 08:08| 来源: 网络整理| 查看: 265

这是今天YCOI第一题的题解。 题目是这样的: 【题目描述】

给定一张地图,定义 X 表示陆地,O 表示海洋,两个格子是连通的当且仅当它们共边,一个大陆定义是一个极大的陆地连通块。极大的连通块的定义是不存在一个格子与当前连通块中的某个格子相连但不属于当前连通块。问地图中有几个大陆。

【输入文件】

第一行两个数 N,M,表示地图的大小。以下 N 行,每行 M 个字母。

【输出文件】

一个数表示大陆个数。

【样例输入】 5 5 XXXOO OOXOO OOOXX XOOOO XOXXX 【样例输出】 4 【数据范围】

对于 30%的数据,满足 1≤N,M≤50; 对于 100%的数据,满足 1≤N,M≤1000。

【题解】

下午刚看到此题,简直与前几天刚做过的luogu1596 Lake Counting一模一样,于是便直接开始打DFS。

主要说一下思路

用一个char类型的二维数组,大小为N*M,用来存放每个格是O还是X,是O就记录O,是X就记录X。(当时jay写的代码,用了一个bool数组,是X就存1,不是就存0,也可以,没什么太大差别)

读完数据之后双层循环char数组,(不建议边读数据边算,不好处理也容易错,而且时间足够),如果碰到是X,就进入dfs函数搜索上下左右的格,看有没有是X的格,只要有,全变成O。dfs函数退出就说明旁边没有X了,这时候count++。

DFS函数里面循环4个方向,分别找有没有是X的格,如果有,就变成O,换成这个格开始搜索,依次递归。

此题有一个坑在于,如果用scanf读数据,读完n和m之后要读一个回车,然后接下来每行最后都要读一个回车,否则有一些char就会存成回车符。这样直接在需要读回车的地方用getline读进去一个字符串,这样不管后面有没有多余的空格就都可以了,更保险一点。当时jay直接用cin读数据,就没有这个问题,所以对于这种数据比较少的题,用cin读数据也不错。

【AC代码】 //ENOR T1 map #include #include #include using namespace std; int dx[5]={ 0,1,-1,0,


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3